home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 July: Mac OS SDK / Dev.CD Jul 99 SDK1.toast / Development Kits / Mac OS / OpenGL 1.0 SDK / Source / Examples / aux / samples / logo.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-05-18  |  34.1 KB  |  1,555 lines  |  [TEXT/CWIE]

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include "tk.h"
  5.  
  6. #if defined(__MWERKS__) || defined(__SC__)
  7.     #include <console.h>
  8. #endif
  9.  
  10.  
  11. #define PI 3.141592654
  12.  
  13. #define    BLACK 0
  14. #define    GRAY 128
  15. #define    WHITE 255
  16. #define BL 0x00
  17. #define WH 0xFF
  18. #define RD 0xA4,0x00,0x00,0xFF
  19. #define WT 0xFF,0xFF,0xFF,0xFF
  20.  
  21. #define    CHECKIMAGEWIDTH 8
  22. #define    CHECKIMAGEHEIGHT 8
  23. #define    BRICKIMAGEWIDTH 16
  24. #define    BRICKIMAGEHEIGHT 16
  25.  
  26.  
  27. GLenum rgb, doubleBuffer, directRender;
  28.  
  29. float black[3] = {0.0, 0.0, 0.0};
  30. float white[3] = {1.0, 1.0, 1.0};
  31. float gray[3] = {0.5, 0.5, 0.5};
  32. float blue[3] = {0.0, 0.0, 1.0};
  33. GLint colorIndexes[3] = {0, 200, 255};
  34.  
  35. GLenum polyMode;
  36. GLenum dithering;
  37. GLenum shade;
  38. GLenum doStipple;
  39.  
  40. double plane[4] = {1.0, 0.0, -1.0, 0.0};
  41. float xRotation = 30.0, yRotation = 30.0;
  42. float zTranslation = -15.0;
  43.  
  44. GLint singleCylinder;
  45. GLint doubleCylinder;
  46. GLint elbow, logo;
  47.  
  48. GLubyte checkImage[3*CHECKIMAGEWIDTH*CHECKIMAGEHEIGHT] = {
  49.     BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH,
  50.     WH, WH, BL, BL, BL, WH, WH, WH, WH, WH, WH, BL, BL, BL, WH, WH,
  51.     WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL,
  52.     BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH,
  53.     WH, WH, BL, BL, BL, WH, WH, WH, WH, WH, WH, BL, BL, BL, WH, WH,
  54.     WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL,
  55.     BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH,
  56.     WH, WH, BL, BL, BL, WH, WH, WH, WH, WH, WH, BL, BL, BL, WH, WH,
  57.     WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL,
  58.     BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH,
  59.     WH, WH, BL, BL, BL, WH, WH, WH, WH, WH, WH, BL, BL, BL, WH, WH,
  60.     WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, 
  61. };
  62. GLubyte brickImage[4*BRICKIMAGEWIDTH*BRICKIMAGEHEIGHT] = {
  63.     RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
  64.     RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
  65.     RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
  66.     RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
  67.     WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT,
  68.     RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
  69.     RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
  70.     RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
  71.     RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
  72.     WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT,
  73.     RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
  74.     RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
  75.     RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
  76.     RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
  77.     WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT,
  78.     RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD
  79. };
  80.  
  81. GLubyte *image = checkImage;
  82. GLint imageHeight = CHECKIMAGEHEIGHT;
  83. GLint imageWidth = CHECKIMAGEWIDTH;
  84.  
  85. float decal[] = {
  86.     GL_DECAL,
  87. };
  88. float modulate[] = {
  89.     GL_MODULATE,
  90. };
  91. float repeat[] = {
  92.     GL_REPEAT,
  93. };
  94. float nearest[] = {
  95.     GL_NEAREST,
  96. };
  97.  
  98. GLubyte stipple[4*32] = {
  99.     0x00, 0x00, 0x00, 0x00,
  100.     0x00, 0x00, 0x00, 0x00,
  101.     0x00, 0x00, 0x00, 0x00,
  102.     0x00, 0x00, 0x00, 0x00,
  103.     0x00, 0x00, 0x00, 0x00,
  104.     0x00, 0x00, 0x00, 0x00,
  105.     0x00, 0x00, 0x00, 0x00,
  106.     0x00, 0x00, 0x00, 0x00,
  107.  
  108.     0x00, 0x0F, 0xF0, 0x00,
  109.     0x00, 0x0F, 0xF0, 0x00,
  110.     0x00, 0x0F, 0xF0, 0x00,
  111.     0x00, 0x0F, 0xF0, 0x00,
  112.     0x00, 0x0F, 0xF0, 0x00,
  113.     0x00, 0x0F, 0xF0, 0x00,
  114.     0x00, 0x0F, 0xF0, 0x00,
  115.     0x00, 0x0F, 0xF0, 0x00,
  116.  
  117.     0x00, 0x0F, 0xF0, 0x00,
  118.     0x00, 0x0F, 0xF0, 0x00,
  119.     0x00, 0x0F, 0xF0, 0x00,
  120.     0x00, 0x0F, 0xF0, 0x00,
  121.     0x00, 0x0F, 0xF0, 0x00,
  122.     0x00, 0x0F, 0xF0, 0x00,
  123.     0x00, 0x0F, 0xF0, 0x00,
  124.     0x00, 0x0F, 0xF0, 0x00,
  125.  
  126.     0x00, 0x00, 0x00, 0x00,
  127.     0x00, 0x00, 0x00, 0x00,
  128.     0x00, 0x00, 0x00, 0x00,
  129.     0x00, 0x00, 0x00, 0x00,
  130.     0x00, 0x00, 0x00, 0x00,
  131.     0x00, 0x00, 0x00, 0x00,
  132.     0x00, 0x00, 0x00, 0x00,
  133.     0x00, 0x00, 0x00, 0x00,
  134. };
  135.  
  136. float tscp[18][2] = {
  137.     {
  138.     0.0, 0.0
  139.     },
  140.     {
  141.     1.0, 0.0
  142.     },
  143.     {
  144.     0.0, 0.125
  145.     },
  146.     {
  147.     1.0, 0.125
  148.     },
  149.     {
  150.     0.0, 0.250
  151.     },
  152.     {
  153.     1.0, 0.25
  154.     },
  155.     {
  156.     0.0, 0.375
  157.     },
  158.     {
  159.     1.0, 0.375
  160.     },
  161.     {
  162.     0.0, 0.50
  163.     },
  164.     {
  165.     1.0, 0.50
  166.     },
  167.     {
  168.     0.0, 0.625
  169.     },
  170.     {
  171.     1.0, 0.625
  172.     },
  173.     {
  174.     0.0, 0.75
  175.     },
  176.     {
  177.     1.0, 0.75
  178.     },
  179.     {
  180.     0.0, 0.875
  181.     },
  182.     {
  183.     1.0, 0.875
  184.     },
  185.     {
  186.     0.0, 1.0
  187.     },
  188.     {
  189.     1.0, 1.0
  190.     }
  191. };
  192. float scp[18][3] = {
  193.     {
  194.     1.000000, 0.000000, 0.000000
  195.     },
  196.     {
  197.     1.000000, 0.000000, 5.000000
  198.     },
  199.     {
  200.     0.707107, 0.707107, 0.000000
  201.     },
  202.     {
  203.     0.707107, 0.707107, 5.000000
  204.     },
  205.     {
  206.     0.000000, 1.000000, 0.000000
  207.     },
  208.     {
  209.     0.000000, 1.000000, 5.000000
  210.     },
  211.     {
  212.     -0.707107, 0.707107, 0.000000
  213.     },
  214.     {
  215.     -0.707107, 0.707107, 5.000000
  216.     },
  217.     {
  218.     -1.000000, 0.000000, 0.000000
  219.     },
  220.     {
  221.     -1.000000, 0.000000, 5.000000
  222.     },
  223.     {
  224.     -0.707107, -0.707107, 0.000000
  225.     },
  226.     {
  227.     -0.707107, -0.707107, 5.000000
  228.     },
  229.     {
  230.     0.000000, -1.000000, 0.000000
  231.     },
  232.     {
  233.     0.000000, -1.000000, 5.000000
  234.     },
  235.     {
  236.     0.707107, -0.707107, 0.000000
  237.     },
  238.     {
  239.     0.707107, -0.707107, 5.000000
  240.     },
  241.     {
  242.     1.000000, 0.000000, 0.000000
  243.     },
  244.     {
  245.     1.000000, 0.000000, 5.000000
  246.     }
  247. };
  248. float dcp[18][3] = {
  249.     {
  250.     1.000000, 0.000000, 0.000000
  251.     },
  252.     {
  253.     1.000000, 0.000000, 7.000000
  254.     },
  255.     {
  256.     0.707107, 0.707107, 0.000000
  257.     },
  258.     {
  259.     0.707107, 0.707107, 7.000000
  260.     },
  261.     {
  262.     0.000000, 1.000000, 0.000000
  263.     },
  264.     {
  265.     0.000000, 1.000000, 7.000000
  266.     },
  267.     {
  268.     -0.707107, 0.707107, 0.000000
  269.     },
  270.     {
  271.     -0.707107, 0.707107, 7.000000
  272.     },
  273.     {
  274.     -1.000000, 0.000000, 0.000000
  275.     },
  276.     {
  277.     -1.000000, 0.000000, 7.000000
  278.     },
  279.     {
  280.     -0.707107, -0.707107, 0.000000
  281.     },
  282.     {
  283.     -0.707107, -0.707107, 7.000000
  284.     },
  285.     {
  286.     0.000000, -1.000000, 0.000000
  287.     },
  288.     {
  289.     0.000000, -1.000000, 7.000000
  290.     },
  291.     {
  292.     0.707107, -0.707107, 0.000000
  293.     },
  294.     {
  295.     0.707107, -0.707107, 7.000000
  296.     },
  297.     {
  298.     1.000000, 0.000000, 0.000000
  299.     },
  300.     {
  301.     1.000000, 0.000000, 7.000000
  302.     }
  303. };
  304. float ep[7][9][3] = {
  305.     {
  306.     {
  307.         1.000000, 0.000000, 0.000000
  308.     },
  309.     {
  310.         0.707107, 0.707107, 0.000000
  311.     },
  312.     {
  313.         0.000000, 1.000000, 0.000000
  314.     },
  315.     {
  316.         -0.707107, 0.707107, 0.000000
  317.     },
  318.     {
  319.         -1.000000, 0.000000, 0.000000
  320.     },
  321.     {
  322.         -0.707107, -0.707107, 0.000000
  323.     },
  324.     {
  325.         0.000000, -1.000000, 0.000000
  326.     },
  327.     {
  328.         0.707107, -0.707107, 0.000000
  329.     },
  330.     {
  331.         1.000000, 0.000000, 0.000000
  332.     }
  333.     },
  334.     {
  335.     {
  336.         1.000000, 0.034074, 0.258819
  337.     },
  338.     {
  339.         0.707107, 0.717087, 0.075806
  340.     },
  341.     {
  342.         0.000000, 1.000000, 0.000000
  343.     },
  344.     {
  345.         -0.707107, 0.717087, 0.075806
  346.     },
  347.     {
  348.         -1.000000, 0.034074, 0.258819
  349.     },
  350.     {
  351.         -0.707107, -0.648939, 0.441832
  352.     },
  353.     {
  354.         0.000000, -0.931852, 0.517638
  355.     },
  356.     {
  357.         0.707107, -0.648939, 0.441832
  358.     },
  359.     {
  360.         1.000000, 0.034074, 0.258819
  361.     }
  362.     },
  363.     {
  364.     {
  365.         1.000000, 0.133975, 0.500000
  366.     },
  367.     {
  368.         0.707107, 0.746347, 0.146447
  369.     },
  370.     {
  371.         0.000000, 1.000000, 0.000000
  372.     },
  373.     {
  374.         -0.707107, 0.746347, 0.146447
  375.     },
  376.     {
  377.         -1.000000, 0.133975, 0.500000
  378.     },
  379.     {
  380.         -0.707107, -0.478398, 0.853553
  381.     },
  382.     {
  383.         0.000000, -0.732051, 1.000000
  384.     },
  385.     {
  386.         0.707107, -0.478398, 0.853553
  387.     },
  388.     {
  389.         1.000000, 0.133975, 0.500000
  390.     }
  391.     },
  392.     {
  393.     {
  394.         1.000000, 0.292893, 0.707107
  395.     },
  396.     {
  397.         0.707107, 0.792893, 0.207107
  398.     },
  399.     {
  400.         0.000000, 1.000000, 0.000000
  401.     },
  402.     {
  403.         -0.707107, 0.792893, 0.207107
  404.     },
  405.     {
  406.         -1.000000, 0.292893, 0.707107
  407.     },
  408.     {
  409.         -0.707107, -0.207107, 1.207107
  410.     },
  411.     {
  412.         0.000000, -0.414214, 1.414214
  413.     },
  414.     {
  415.         0.707107, -0.207107, 1.207107
  416.     },
  417.     {
  418.         1.000000, 0.292893, 0.707107
  419.     }
  420.     },
  421.     {
  422.     {
  423.         1.000000, 0.500000, 0.866025
  424.     },
  425.     {
  426.         0.707107, 0.853553, 0.253653
  427.     },
  428.     {
  429.         0.000000, 1.000000, 0.000000
  430.     },
  431.     {
  432.         -0.707107, 0.853553, 0.253653
  433.     },
  434.     {
  435.         -1.000000, 0.500000, 0.866025
  436.     },
  437.     {
  438.         -0.707107, 0.146447, 1.478398
  439.     },
  440.     {
  441.         0.000000, 0.000000, 1.732051
  442.     },
  443.     {
  444.         0.707107, 0.146447, 1.478398
  445.     },
  446.     {
  447.         1.000000, 0.500000, 0.866025
  448.     }
  449.     },
  450.     {
  451.     {
  452.         1.000000, 0.741181, 0.965926
  453.     },
  454.     {
  455.         0.707107, 0.924194, 0.282913
  456.     },
  457.     {
  458.         0.000000, 1.000000, 0.000000
  459.     },
  460.     {
  461.         -0.707107, 0.924194, 0.282913
  462.     },
  463.     {
  464.         -1.000000, 0.741181, 0.965926
  465.     },
  466.     {
  467.         -0.707107, 0.558168, 1.648939
  468.     },
  469.     {
  470.         0.000000, 0.482362, 1.931852
  471.     },
  472.     {
  473.         0.707107, 0.558168, 1.648939
  474.     },
  475.     {
  476.         1.000000, 0.741181, 0.965926
  477.     }
  478.     },
  479.     {
  480.     {
  481.         1.000000, 1.000000, 1.000000
  482.     },
  483.     {
  484.         0.707107, 1.000000, 0.292893
  485.     },
  486.     {
  487.         0.000000, 1.000000, 0.000000
  488.     },
  489.     {
  490.         -0.707107, 1.000000, 0.292893
  491.     },
  492.     {
  493.         -1.000000, 1.000000, 1.000000
  494.     },
  495.     {
  496.         -0.707107, 1.000000, 1.707107
  497.     },
  498.     {
  499.         0.000000, 1.000000, 2.000000
  500.     },
  501.     {
  502.         0.707107, 1.000000, 1.707107
  503.     },
  504.     {
  505.         1.000000, 1.000000, 1.000000
  506.     }
  507.     }
  508. };
  509. float en[7][9][3] = {
  510.     {
  511.     {
  512.         1.000000, 0.000000, 0.000000
  513.     },
  514.     {
  515.         0.707107, 0.707107, 0.000000
  516.     },
  517.     {
  518.         0.000000, 1.000000, 0.000000
  519.     },
  520.     {
  521.         -0.707107, 0.707107, 0.000000
  522.     },
  523.     {
  524.         -1.000000, 0.000000, 0.000000
  525.     },
  526.     {
  527.         -0.707107, -0.707107, 0.000000
  528.     },
  529.     {
  530.         0.000000, -1.000000, 0.000000
  531.     },
  532.     {
  533.         0.707107, -0.707107, 0.000000
  534.     },
  535.     {
  536.         1.000000, 0.000000, 0.000000
  537.     }
  538.     },
  539.     {
  540.     {
  541.         1.000000, 0.000000, 0.000000
  542.     },
  543.     {
  544.         0.707107, 0.683013, -0.183013
  545.     },
  546.     {
  547.         0.000000, 0.965926, -0.258819
  548.     },
  549.     {
  550.         -0.707107, 0.683013, -0.183013
  551.     },
  552.     {
  553.         -1.000000, 0.000000, 0.000000
  554.     },
  555.     {
  556.         -0.707107, -0.683013, 0.183013
  557.     },
  558.     {
  559.         0.000000, -0.965926, 0.258819
  560.     },
  561.     {
  562.         0.707107, -0.683013, 0.183013
  563.     },
  564.     {
  565.         1.000000, 0.000000, 0.000000
  566.     }
  567.     },
  568.     {
  569.     {
  570.         1.000000, 0.000000, 0.000000
  571.     },
  572.     {
  573.         0.707107, 0.612372, -0.353553
  574.     },
  575.     {
  576.         0.000000, 0.866025, -0.500000
  577.     },
  578.     {
  579.         -0.707107, 0.612372, -0.353553
  580.     },
  581.     {
  582.         -1.000000, 0.000000, 0.000000
  583.     },
  584.     {
  585.         -0.707107, -0.612372, 0.353553
  586.     },
  587.     {
  588.         0.000000, -0.866025, 0.500000
  589.     },
  590.     {
  591.         0.707107, -0.612372, 0.353553
  592.     },
  593.     {
  594.         1.000000, 0.000000, 0.000000
  595.     }
  596.     },
  597.     {
  598.     {
  599.         1.000000, 0.000000, 0.000000
  600.     },
  601.     {
  602.         0.000000, 0.707107, -0.707107
  603.     },
  604.     {
  605.         -0.707107, 0.500000, -0.500000
  606.     },
  607.     {
  608.         -1.000000, 0.000000, 0.000000
  609.     },
  610.     {
  611.         -0.707107, -0.500000, 0.500000
  612.     },
  613.     {
  614.         0.000000, -0.707107, 0.707107
  615.     },
  616.     {
  617.         0.707107, -0.500000, 0.500000
  618.     },
  619.     {
  620.         1.000000, 0.000000, 0.000000
  621.     }
  622.     },
  623.     {
  624.     {
  625.         1.000000, 0.000000, 0.000000
  626.     },
  627.     {
  628.         0.707107, 0.353553, -0.612372
  629.     },
  630.     {
  631.         0.000000, 0.500000, -0.866025
  632.     },
  633.     {
  634.         -0.707107, 0.353553, -0.612372
  635.     },
  636.     {
  637.         -1.000000, 0.000000, 0.000000
  638.     },
  639.     {
  640.         -0.707107, -0.353553, 0.612372
  641.     },
  642.     {
  643.         0.000000, -0.500000, 0.866025
  644.     },
  645.     {
  646.         0.707107, -0.353553, 0.612372
  647.     },
  648.     {
  649.         1.000000, 0.000000, 0.000000
  650.     }
  651.     },
  652.     {
  653.     {
  654.         1.000000, 0.000000, 0.000000
  655.     },
  656.     {
  657.         0.707107, 0.183013, -0.683013
  658.     },
  659.     {
  660.         0.000000, 0.258819, -0.965926
  661.     },
  662.     {
  663.         -0.707107, 0.183013, -0.683013
  664.     },
  665.     {
  666.         -1.000000, 0.000000, 0.000000
  667.     },
  668.     {
  669.         -0.707107, -0.183013, 0.683013
  670.     },
  671.     {
  672.         0.000000, -0.258819, 0.965926
  673.     },
  674.     {
  675.         0.707107, -0.183013, 0.683013
  676.     },
  677.     {
  678.         1.000000, 0.000000, 0.000000
  679.     }
  680.     },
  681.     {
  682.     {
  683.         1.000000, 0.000000, 0.000000
  684.     },
  685.     {
  686.         0.707107, 0.000000, -0.707107
  687.     },
  688.     {
  689.         0.000000, 0.000000, -1.000000
  690.     },
  691.     {
  692.         -0.707107, 0.000000, -0.707107
  693.     },
  694.     {
  695.         -1.000000, 0.000000, 0.000000
  696.     },
  697.     {
  698.         -0.707107, 0.000000, 0.707107
  699.     },
  700.     {
  701.         0.000000, 0.000000, 1.000000
  702.     },
  703.     {
  704.         0.707107, 0.000000, 0.707107
  705.     },
  706.     {
  707.         1.000000, 0.000000, 0.000000
  708.     }
  709.     }
  710. };
  711. float tep[7][9][2] = {
  712.     {
  713.     {
  714.         0,     0.0
  715.     },
  716.     {
  717.         0.125, 0.0
  718.     },
  719.     {
  720.         0.25,  0.0
  721.     },
  722.     {
  723.         0.375, 0.0
  724.     },
  725.     {
  726.         0.5,   0.0
  727.     },
  728.     {
  729.         0.625, 0.0
  730.     },
  731.     {
  732.         0.75,  0.0
  733.     },
  734.     {
  735.         0.875, 0.0
  736.     },
  737.     {
  738.         1.0,   0.0
  739.     }
  740.     },
  741.     {
  742.     {
  743.         0,     0.16667
  744.     },
  745.     {
  746.         0.125, 0.16667
  747.     },
  748.     {
  749.         0.25,  0.16667
  750.     },
  751.     {
  752.         0.375, 0.16667
  753.     },
  754.     {
  755.         0.5,   0.16667
  756.     },
  757.     {
  758.         0.625, 0.16667
  759.     },
  760.     {
  761.         0.75,  0.16667
  762.     },
  763.     {
  764.         0.875, 0.16667
  765.     },
  766.     {
  767.         1.0,   0.16667
  768.     }
  769.     },
  770.     {
  771.     {
  772.         0,     0.33333
  773.     },
  774.     {
  775.         0.125, 0.33333
  776.     },
  777.     {
  778.         0.25,  0.33333
  779.     },
  780.     {
  781.         0.375, 0.33333
  782.     },
  783.     {
  784.         0.5,   0.33333
  785.     },
  786.     {
  787.         0.625, 0.33333
  788.     },
  789.     {
  790.         0.75,  0.33333
  791.     },
  792.     {
  793.         0.875, 0.33333
  794.     },
  795.     {
  796.         1.0,   0.33333
  797.     }
  798.     },
  799.     {
  800.     {
  801.         0,     0.5
  802.     },
  803.     {
  804.         0.125, 0.5
  805.     },
  806.     {
  807.         0.25,  0.5
  808.     },
  809.     {
  810.         0.375, 0.5
  811.     },
  812.     {
  813.         0.5,   0.5
  814.     },
  815.     {
  816.         0.625, 0.5
  817.     },
  818.     {
  819.         0.75,  0.5
  820.     },
  821.     {
  822.         0.875, 0.5
  823.     },
  824.     {
  825.         1.0,   0.5
  826.     }
  827.     },
  828.     {
  829.     {
  830.         0,     0.6667
  831.     },
  832.     {
  833.         0.125, 0.6667
  834.     },
  835.     {
  836.         0.25,  0.6667
  837.     },
  838.     {
  839.         0.375, 0.6667
  840.     },
  841.     {
  842.         0.5,   0.6667
  843.     },
  844.     {
  845.         0.625, 0.6667
  846.     },
  847.     {
  848.         0.75,  0.6667
  849.     },
  850.     {
  851.         0.875, 0.6667
  852.     },
  853.     {
  854.         1.0,   0.6667
  855.     }
  856.     },
  857.     {
  858.     {
  859.         0,     0.83333
  860.     },
  861.     {
  862.         0.125, 0.83333
  863.     },
  864.     {
  865.         0.25,  0.83333
  866.     },
  867.     {
  868.         0.375, 0.83333
  869.     },
  870.     {
  871.         0.5,   0.83333
  872.     },
  873.     {
  874.         0.625, 0.83333
  875.     },
  876.     {
  877.         0.75,  0.83333
  878.     },
  879.     {
  880.         0.875, 0.83333
  881.     },
  882.     {
  883.         1.0,   0.83333
  884.     }
  885.     },
  886.     {
  887.     {
  888.         0,     1.0
  889.     },
  890.     {
  891.         0.125, 1.0
  892.     },
  893.     {
  894.         0.25,  1.0
  895.     },
  896.     {
  897.         0.375, 1.0
  898.     },
  899.     {
  900.         0.5,   1.0
  901.     },
  902.     {
  903.         0.625, 1.0
  904.     },
  905.     {
  906.         0.75,  1.0
  907.     },
  908.     {
  909.         0.875, 1.0
  910.     },
  911.     {
  912.         1.0,   1.0
  913.     }
  914.     }
  915. };
  916.  
  917.  
  918. static void SetUpAntiAliasedGrayScale(void)
  919. {
  920.     float color;
  921.     GLint i, j;
  922.  
  923.     for (i = 0; i < 16; i++) {
  924.     color = (2 * i + 1) / 32.0;
  925.     for (j = 0; j < 16; j++) {
  926.         tkSetOneColor(i*16+j, color*j/15.0, color*j/15.0, color*j/15.0);
  927.     }
  928.     }
  929. }
  930.  
  931. static void BendForward(void)
  932. {
  933.  
  934.     glTranslatef(0.0, 1.0, 0.0);
  935.     glRotatef(90.0, 1, 0, 0);
  936.     glTranslatef(0.0, -1.0, 0.0);
  937. }
  938.  
  939. static void BendLeft(void)
  940. {
  941.  
  942.     glRotatef(-90.0, 0, 0, 1);
  943.     glTranslatef(0.0, 1.0, 0.0);
  944.     glRotatef(90.0, 1, 0, 0);
  945.     glTranslatef(0.0, -1.0, 0.0);
  946. }
  947.  
  948. static void BendRight(void)
  949. {
  950.  
  951.     glRotatef(90.0, 0, 0, 1);
  952.     glTranslatef(0.0, 1.0, 0.0);
  953.     glRotatef(90.0, 1, 0, 0);
  954.     glTranslatef(0.0, -1.0, 0.0);
  955. }
  956.  
  957. static void BuildSingleCylinder(void)
  958. {
  959.  
  960.     glNewList(singleCylinder, GL_COMPILE);
  961.  
  962.     glBegin(GL_TRIANGLE_STRIP);
  963.        glNormal3fv(scp[0]); glTexCoord2fv(tscp[0]); glVertex3fv(scp[0]);
  964.        glNormal3fv(scp[0]); glTexCoord2fv(tscp[1]); glVertex3fv(scp[1]);
  965.        glNormal3fv(scp[2]); glTexCoord2fv(tscp[2]); glVertex3fv(scp[2]);
  966.        glNormal3fv(scp[2]); glTexCoord2fv(tscp[3]); glVertex3fv(scp[3]);
  967.        glNormal3fv(scp[4]); glTexCoord2fv(tscp[4]); glVertex3fv(scp[4]);
  968.        glNormal3fv(scp[4]); glTexCoord2fv(tscp[5]); glVertex3fv(scp[5]);
  969.        glNormal3fv(scp[6]); glTexCoord2fv(tscp[6]); glVertex3fv(scp[6]);
  970.        glNormal3fv(scp[6]); glTexCoord2fv(tscp[7]); glVertex3fv(scp[7]);
  971.        glNormal3fv(scp[8]); glTexCoord2fv(tscp[8]); glVertex3fv(scp[8]);
  972.        glNormal3fv(scp[8]); glTexCoord2fv(tscp[9]); glVertex3fv(scp[9]);
  973.        glNormal3fv(scp[10]); glTexCoord2fv(tscp[10]); glVertex3fv(scp[10]);
  974.        glNormal3fv(scp[10]); glTexCoord2fv(tscp[11]); glVertex3fv(scp[11]);
  975.        glNormal3fv(scp[12]); glTexCoord2fv(tscp[12]); glVertex3fv(scp[12]);
  976.        glNormal3fv(scp[12]); glTexCoord2fv(tscp[13]); glVertex3fv(scp[13]);
  977.        glNormal3fv(scp[14]); glTexCoord2fv(tscp[14]); glVertex3fv(scp[14]);
  978.        glNormal3fv(scp[14]); glTexCoord2fv(tscp[15]); glVertex3fv(scp[15]);
  979.        glNormal3fv(scp[16]); glTexCoord2fv(tscp[16]); glVertex3fv(scp[16]);
  980.        glNormal3fv(scp[16]); glTexCoord2fv(tscp[17]); glVertex3fv(scp[17]);
  981.     glEnd();
  982.  
  983.     glEndList();
  984. }
  985.  
  986. static void BuildDoubleCylinder(void)
  987. {
  988.  
  989.     glNewList(doubleCylinder, GL_COMPILE);
  990.  
  991.     glBegin(GL_TRIANGLE_STRIP);
  992.     glNormal3fv(dcp[0]); glTexCoord2fv(tscp[0]); glVertex3fv(dcp[0]);
  993.     glNormal3fv(dcp[0]); glTexCoord2fv(tscp[1]); glVertex3fv(dcp[1]);
  994.     glNormal3fv(dcp[2]); glTexCoord2fv(tscp[2]); glVertex3fv(dcp[2]);
  995.     glNormal3fv(dcp[2]); glTexCoord2fv(tscp[3]); glVertex3fv(dcp[3]);
  996.     glNormal3fv(dcp[4]); glTexCoord2fv(tscp[4]); glVertex3fv(dcp[4]);
  997.     glNormal3fv(dcp[4]); glTexCoord2fv(tscp[5]); glVertex3fv(dcp[5]);
  998.     glNormal3fv(dcp[6]); glTexCoord2fv(tscp[6]); glVertex3fv(dcp[6]);
  999.     glNormal3fv(dcp[6]); glTexCoord2fv(tscp[7]); glVertex3fv(dcp[7]);
  1000.     glNormal3fv(dcp[8]); glTexCoord2fv(tscp[8]); glVertex3fv(dcp[8]);
  1001.     glNormal3fv(dcp[8]); glTexCoord2fv(tscp[9]); glVertex3fv(dcp[9]);
  1002.     glNormal3fv(dcp[10]); glTexCoord2fv(tscp[10]); glVertex3fv(dcp[10]);
  1003.     glNormal3fv(dcp[10]); glTexCoord2fv(tscp[11]); glVertex3fv(dcp[11]);
  1004.     glNormal3fv(dcp[12]); glTexCoord2fv(tscp[12]); glVertex3fv(dcp[12]);
  1005.     glNormal3fv(dcp[12]); glTexCoord2fv(tscp[13]); glVertex3fv(dcp[13]);
  1006.     glNormal3fv(dcp[14]); glTexCoord2fv(tscp[14]); glVertex3fv(dcp[14]);
  1007.     glNormal3fv(dcp[14]); glTexCoord2fv(tscp[15]); glVertex3fv(dcp[15]);
  1008.     glNormal3fv(dcp[16]); glTexCoord2fv(tscp[16]); glVertex3fv(dcp[16]);
  1009.     glNormal3fv(dcp[16]); glTexCoord2fv(tscp[17]); glVertex3fv(dcp[17]);
  1010.     glEnd();
  1011.  
  1012.     glEndList();
  1013. }
  1014.  
  1015. static void BuildElbow(void)
  1016. {
  1017.  
  1018.     glNewList(elbow, GL_COMPILE);
  1019.  
  1020.     glBegin(GL_TRIANGLE_STRIP);
  1021.     glNormal3fv(en[0][0]); glTexCoord2fv(tep[0][0]); glVertex3fv(ep[0][0]);
  1022.     glNormal3fv(en[1][0]); glTexCoord2fv(tep[1][0]); glVertex3fv(ep[1][0]);
  1023.     glNormal3fv(en[0][1]); glTexCoord2fv(tep[0][1]); glVertex3fv(ep[0][1]);
  1024.     glNormal3fv(en[1][1]); glTexCoord2fv(tep[1][1]); glVertex3fv(ep[1][1]);
  1025.     glNormal3fv(en[0][2]); glTexCoord2fv(tep[0][2]); glVertex3fv(ep[0][2]);
  1026.     glNormal3fv(en[1][2]); glTexCoord2fv(tep[1][2]); glVertex3fv(ep[1][2]);
  1027.     glNormal3fv(en[0][3]); glTexCoord2fv(tep[0][3]); glVertex3fv(ep[0][3]);
  1028.     glNormal3fv(en[1][3]); glTexCoord2fv(tep[1][3]); glVertex3fv(ep[1][3]);
  1029.     glNormal3fv(en[0][4]); glTexCoord2fv(tep[0][4]); glVertex3fv(ep[0][4]);
  1030.     glNormal3fv(en[1][4]); glTexCoord2fv(tep[1][4]); glVertex3fv(ep[1][4]);
  1031.     glNormal3fv(en[0][5]); glTexCoord2fv(tep[0][5]); glVertex3fv(ep[0][5]);
  1032.     glNormal3fv(en[1][5]); glTexCoord2fv(tep[1][5]); glVertex3fv(ep[1][5]);
  1033.     glNormal3fv(en[0][6]); glTexCoord2fv(tep[0][6]); glVertex3fv(ep[0][6]);
  1034.     glNormal3fv(en[1][6]); glTexCoord2fv(tep[1][6]); glVertex3fv(ep[1][6]);
  1035.     glNormal3fv(en[0][7]); glTexCoord2fv(tep[0][7]); glVertex3fv(ep[0][7]);
  1036.     glNormal3fv(en[1][7]); glTexCoord2fv(tep[1][7]); glVertex3fv(ep[1][7]);
  1037.     glNormal3fv(en[0][8]); glTexCoord2fv(tep[0][8]); glVertex3fv(ep[0][8]);
  1038.     glNormal3fv(en[1][8]); glTexCoord2fv(tep[1][8]); glVertex3fv(ep[1][8]);
  1039.     glEnd();
  1040.     glBegin(GL_TRIANGLE_STRIP);
  1041.     glNormal3fv(en[1][0]); glTexCoord2fv(tep[1][0]); glVertex3fv(ep[1][0]);
  1042.     glNormal3fv(en[2][0]); glTexCoord2fv(tep[2][0]); glVertex3fv(ep[2][0]);
  1043.     glNormal3fv(en[1][1]); glTexCoord2fv(tep[1][1]); glVertex3fv(ep[1][1]);
  1044.     glNormal3fv(en[2][1]); glTexCoord2fv(tep[2][1]); glVertex3fv(ep[2][1]);
  1045.     glNormal3fv(en[1][2]); glTexCoord2fv(tep[1][2]); glVertex3fv(ep[1][2]);
  1046.     glNormal3fv(en[2][2]); glTexCoord2fv(tep[2][2]); glVertex3fv(ep[2][2]);
  1047.     glNormal3fv(en[1][3]); glTexCoord2fv(tep[1][3]); glVertex3fv(ep[1][3]);
  1048.     glNormal3fv(en[2][3]); glTexCoord2fv(tep[2][3]); glVertex3fv(ep[2][3]);
  1049.     glNormal3fv(en[1][4]); glTexCoord2fv(tep[1][4]); glVertex3fv(ep[1][4]);
  1050.     glNormal3fv(en[2][4]); glTexCoord2fv(tep[2][4]); glVertex3fv(ep[2][4]);
  1051.     glNormal3fv(en[1][5]); glTexCoord2fv(tep[1][5]); glVertex3fv(ep[1][5]);
  1052.     glNormal3fv(en[2][5]); glTexCoord2fv(tep[2][5]); glVertex3fv(ep[2][5]);
  1053.     glNormal3fv(en[1][6]); glTexCoord2fv(tep[1][6]); glVertex3fv(ep[1][6]);
  1054.     glNormal3fv(en[2][6]); glTexCoord2fv(tep[2][6]); glVertex3fv(ep[2][6]);
  1055.     glNormal3fv(en[1][7]); glTexCoord2fv(tep[1][7]); glVertex3fv(ep[1][7]);
  1056.     glNormal3fv(en[2][7]); glTexCoord2fv(tep[2][7]); glVertex3fv(ep[2][7]);
  1057.     glNormal3fv(en[1][8]); glTexCoord2fv(tep[1][8]); glVertex3fv(ep[1][8]);
  1058.     glNormal3fv(en[2][8]); glTexCoord2fv(tep[2][8]); glVertex3fv(ep[2][8]);
  1059.     glEnd();
  1060.     glBegin(GL_TRIANGLE_STRIP);
  1061.     glNormal3fv(en[2][0]); glTexCoord2fv(tep[2][0]); glVertex3fv(ep[2][0]);
  1062.     glNormal3fv(en[3][0]); glTexCoord2fv(tep[3][0]); glVertex3fv(ep[3][0]);
  1063.     glNormal3fv(en[2][1]); glTexCoord2fv(tep[2][1]); glVertex3fv(ep[2][1]);
  1064.     glNormal3fv(en[3][1]); glTexCoord2fv(tep[3][1]); glVertex3fv(ep[3][1]);
  1065.     glNormal3fv(en[2][2]); glTexCoord2fv(tep[2][2]); glVertex3fv(ep[2][2]);
  1066.     glNormal3fv(en[3][2]); glTexCoord2fv(tep[3][2]); glVertex3fv(ep[3][2]);
  1067.     glNormal3fv(en[2][3]); glTexCoord2fv(tep[2][3]); glVertex3fv(ep[2][3]);
  1068.     glNormal3fv(en[3][3]); glTexCoord2fv(tep[3][3]); glVertex3fv(ep[3][3]);
  1069.     glNormal3fv(en[2][4]); glTexCoord2fv(tep[2][4]); glVertex3fv(ep[2][4]);
  1070.     glNormal3fv(en[3][4]); glTexCoord2fv(tep[3][4]); glVertex3fv(ep[3][4]);
  1071.     glNormal3fv(en[2][5]); glTexCoord2fv(tep[2][5]); glVertex3fv(ep[2][5]);
  1072.     glNormal3fv(en[3][5]); glTexCoord2fv(tep[3][5]); glVertex3fv(ep[3][5]);
  1073.     glNormal3fv(en[2][6]); glTexCoord2fv(tep[2][6]); glVertex3fv(ep[2][6]);
  1074.     glNormal3fv(en[3][6]); glTexCoord2fv(tep[3][6]); glVertex3fv(ep[3][6]);
  1075.     glNormal3fv(en[2][7]); glTexCoord2fv(tep[2][7]); glVertex3fv(ep[2][7]);
  1076.     glNormal3fv(en[3][7]); glTexCoord2fv(tep[3][7]); glVertex3fv(ep[3][7]);
  1077.     glNormal3fv(en[2][8]); glTexCoord2fv(tep[2][8]); glVertex3fv(ep[2][8]);
  1078.     glNormal3fv(en[3][8]); glTexCoord2fv(tep[3][8]); glVertex3fv(ep[3][8]);
  1079.     glEnd();
  1080.     glBegin(GL_TRIANGLE_STRIP);
  1081.     glNormal3fv(en[3][0]); glTexCoord2fv(tep[3][0]); glVertex3fv(ep[3][0]);
  1082.     glNormal3fv(en[4][0]); glTexCoord2fv(tep[4][0]); glVertex3fv(ep[4][0]);
  1083.     glNormal3fv(en[3][1]); glTexCoord2fv(tep[3][1]); glVertex3fv(ep[3][1]);
  1084.     glNormal3fv(en[4][1]); glTexCoord2fv(tep[4][1]); glVertex3fv(ep[4][1]);
  1085.     glNormal3fv(en[3][2]); glTexCoord2fv(tep[3][2]); glVertex3fv(ep[3][2]);
  1086.     glNormal3fv(en[4][2]); glTexCoord2fv(tep[4][2]); glVertex3fv(ep[4][2]);
  1087.     glNormal3fv(en[3][3]); glTexCoord2fv(tep[3][3]); glVertex3fv(ep[3][3]);
  1088.     glNormal3fv(en[4][3]); glTexCoord2fv(tep[4][3]); glVertex3fv(ep[4][3]);
  1089.     glNormal3fv(en[3][4]); glTexCoord2fv(tep[3][4]); glVertex3fv(ep[3][4]);
  1090.     glNormal3fv(en[4][4]); glTexCoord2fv(tep[4][4]); glVertex3fv(ep[4][4]);
  1091.     glNormal3fv(en[3][5]); glTexCoord2fv(tep[3][5]); glVertex3fv(ep[3][5]);
  1092.     glNormal3fv(en[4][5]); glTexCoord2fv(tep[4][5]); glVertex3fv(ep[4][5]);
  1093.     glNormal3fv(en[3][6]); glTexCoord2fv(tep[3][6]); glVertex3fv(ep[3][6]);
  1094.     glNormal3fv(en[4][6]); glTexCoord2fv(tep[4][6]); glVertex3fv(ep[4][6]);
  1095.     glNormal3fv(en[3][7]); glTexCoord2fv(tep[3][7]); glVertex3fv(ep[3][7]);
  1096.     glNormal3fv(en[4][7]); glTexCoord2fv(tep[4][7]); glVertex3fv(ep[4][7]);
  1097.     glNormal3fv(en[3][8]); glTexCoord2fv(tep[3][8]); glVertex3fv(ep[3][8]);
  1098.     glNormal3fv(en[4][8]); glTexCoord2fv(tep[4][8]); glVertex3fv(ep[4][8]);
  1099.     glEnd();
  1100.     glBegin(GL_TRIANGLE_STRIP);
  1101.     glNormal3fv(en[4][0]); glTexCoord2fv(tep[4][0]); glVertex3fv(ep[4][0]);
  1102.     glNormal3fv(en[5][0]); glTexCoord2fv(tep[5][0]); glVertex3fv(ep[5][0]);
  1103.     glNormal3fv(en[4][1]); glTexCoord2fv(tep[4][1]); glVertex3fv(ep[4][1]);
  1104.     glNormal3fv(en[5][1]); glTexCoord2fv(tep[5][1]); glVertex3fv(ep[5][1]);
  1105.     glNormal3fv(en[4][2]); glTexCoord2fv(tep[4][2]); glVertex3fv(ep[4][2]);
  1106.     glNormal3fv(en[5][2]); glTexCoord2fv(tep[5][2]); glVertex3fv(ep[5][2]);
  1107.     glNormal3fv(en[4][3]); glTexCoord2fv(tep[4][3]); glVertex3fv(ep[4][3]);
  1108.     glNormal3fv(en[5][3]); glTexCoord2fv(tep[5][3]); glVertex3fv(ep[5][3]);
  1109.     glNormal3fv(en[4][4]); glTexCoord2fv(tep[4][4]); glVertex3fv(ep[4][4]);
  1110.     glNormal3fv(en[5][4]); glTexCoord2fv(tep[5][4]); glVertex3fv(ep[5][4]);
  1111.     glNormal3fv(en[4][5]); glTexCoord2fv(tep[4][5]); glVertex3fv(ep[4][5]);
  1112.     glNormal3fv(en[5][5]); glTexCoord2fv(tep[5][5]); glVertex3fv(ep[5][5]);
  1113.     glNormal3fv(en[4][6]); glTexCoord2fv(tep[4][6]); glVertex3fv(ep[4][6]);
  1114.     glNormal3fv(en[5][6]); glTexCoord2fv(tep[5][6]); glVertex3fv(ep[5][6]);
  1115.     glNormal3fv(en[4][7]); glTexCoord2fv(tep[4][7]); glVertex3fv(ep[4][7]);
  1116.     glNormal3fv(en[5][7]); glTexCoord2fv(tep[5][7]); glVertex3fv(ep[5][7]);
  1117.     glNormal3fv(en[4][8]); glTexCoord2fv(tep[4][8]); glVertex3fv(ep[4][8]);
  1118.     glNormal3fv(en[5][8]); glTexCoord2fv(tep[5][8]); glVertex3fv(ep[5][8]);
  1119.     glEnd();
  1120.     glBegin(GL_TRIANGLE_STRIP);
  1121.     glNormal3fv(en[5][0]); glTexCoord2fv(tep[5][0]); glVertex3fv(ep[5][0]);
  1122.     glNormal3fv(en[6][0]); glTexCoord2fv(tep[6][0]); glVertex3fv(ep[6][0]);
  1123.     glNormal3fv(en[5][1]); glTexCoord2fv(tep[5][1]); glVertex3fv(ep[5][1]);
  1124.     glNormal3fv(en[6][1]); glTexCoord2fv(tep[6][1]); glVertex3fv(ep[6][1]);
  1125.     glNormal3fv(en[5][2]); glTexCoord2fv(tep[5][2]); glVertex3fv(ep[5][2]);
  1126.     glNormal3fv(en[6][2]); glTexCoord2fv(tep[6][2]); glVertex3fv(ep[6][2]);
  1127.     glNormal3fv(en[5][3]); glTexCoord2fv(tep[5][3]); glVertex3fv(ep[5][3]);
  1128.     glNormal3fv(en[6][3]); glTexCoord2fv(tep[6][3]); glVertex3fv(ep[6][3]);
  1129.     glNormal3fv(en[5][4]); glTexCoord2fv(tep[5][4]); glVertex3fv(ep[5][4]);
  1130.     glNormal3fv(en[6][4]); glTexCoord2fv(tep[6][4]); glVertex3fv(ep[6][4]);
  1131.     glNormal3fv(en[5][5]); glTexCoord2fv(tep[5][5]); glVertex3fv(ep[5][5]);
  1132.     glNormal3fv(en[6][5]); glTexCoord2fv(tep[6][5]); glVertex3fv(ep[6][5]);
  1133.     glNormal3fv(en[5][6]); glTexCoord2fv(tep[5][6]); glVertex3fv(ep[5][6]);
  1134.     glNormal3fv(en[6][6]); glTexCoord2fv(tep[6][6]); glVertex3fv(ep[6][6]);
  1135.     glNormal3fv(en[5][7]); glTexCoord2fv(tep[5][7]); glVertex3fv(ep[5][7]);
  1136.     glNormal3fv(en[6][7]); glTexCoord2fv(tep[6][7]); glVertex3fv(ep[6][7]);
  1137.     glNormal3fv(en[5][8]); glTexCoord2fv(tep[5][8]); glVertex3fv(ep[5][8]);
  1138.     glNormal3fv(en[6][8]); glTexCoord2fv(tep[6][8]); glVertex3fv(ep[6][8]);
  1139.     glEnd();
  1140.  
  1141.     glEndList();
  1142. }
  1143.  
  1144. static void BuildLogo(void)
  1145. {
  1146.  
  1147.     glNewList(logo, GL_COMPILE);
  1148.  
  1149.     glTranslatef(5.5, -3.5, 4.5);
  1150.     glTranslatef(0.0, 0.0, -7.0);
  1151.     glCallList(doubleCylinder);
  1152.     BendForward();
  1153.     glCallList(elbow);
  1154.     glTranslatef(0.0, 0.0, -7.0);
  1155.     glCallList(doubleCylinder);
  1156.     BendForward();
  1157.     glCallList(elbow);
  1158.     glTranslatef(0.0, 0.0, -5.0);
  1159.     glCallList(singleCylinder);
  1160.     BendRight();
  1161.     glCallList(elbow);
  1162.     glTranslatef(0.0, 0.0, -7.0);
  1163.     glCallList(doubleCylinder);
  1164.     BendForward();
  1165.     glCallList(elbow);
  1166.     glTranslatef(0.0, 0.0, -7.0);
  1167.     glCallList(doubleCylinder);
  1168.     BendForward();
  1169.     glCallList(elbow);
  1170.     glTranslatef(0.0, 0.0, -5.0);
  1171.     glCallList(singleCylinder);
  1172.     BendLeft();
  1173.     glCallList(elbow);
  1174.     glTranslatef(0.0, 0.0, -7.0);
  1175.     glCallList(doubleCylinder);
  1176.     BendForward();
  1177.     glCallList(elbow);
  1178.     glTranslatef(0.0, 0.0, -7.0);
  1179.     glCallList(doubleCylinder);
  1180.     BendForward();
  1181.     glCallList(elbow);
  1182.     glTranslatef(0.0, 0.0, -5.0);
  1183.     glCallList(singleCylinder);
  1184.     BendRight();
  1185.     glCallList(elbow);
  1186.     glTranslatef(0.0, 0.0, -7.0);
  1187.     glCallList(doubleCylinder);
  1188.     BendForward();
  1189.     glCallList(elbow);
  1190.     glTranslatef(0.0, 0.0, -7.0);
  1191.     glCallList(doubleCylinder);
  1192.     BendForward();
  1193.     glCallList(elbow);
  1194.     glTranslatef(0.0, 0.0, -5.0);
  1195.     glCallList(singleCylinder);
  1196.     BendLeft();
  1197.     glCallList(elbow);
  1198.     glTranslatef(0.0, 0.0, -7.0);
  1199.     glCallList(doubleCylinder);
  1200.     BendForward();
  1201.     glCallList(elbow);
  1202.     glTranslatef(0.0, 0.0, -7.0);
  1203.     glCallList(doubleCylinder);
  1204.     BendForward();
  1205.     glCallList(elbow);
  1206.     glTranslatef(0.0, 0.0, -5.0);
  1207.     glCallList(singleCylinder);
  1208.     BendRight();
  1209.     glCallList(elbow);
  1210.     glTranslatef(0.0, 0.0, -7.0);
  1211.     glCallList(doubleCylinder);
  1212.     BendForward();
  1213.     glCallList(elbow);
  1214.     glTranslatef(0.0, 0.0, -7.0);
  1215.     glCallList(doubleCylinder);
  1216.     BendForward();
  1217.     glCallList(elbow);
  1218.     glTranslatef(0.0, 0.0, -5.0);
  1219.     glCallList(singleCylinder);
  1220.     BendLeft();
  1221.     glCallList(elbow);
  1222.  
  1223.     glEndList();
  1224. }
  1225.  
  1226. static void BuildLists(void)
  1227. {
  1228.  
  1229.     singleCylinder = glGenLists(1);
  1230.     doubleCylinder = glGenLists(1);
  1231.     elbow = glGenLists(1);
  1232.     logo = glGenLists(1);
  1233.  
  1234.     BuildSingleCylinder();
  1235.     BuildDoubleCylinder();
  1236.     BuildElbow();
  1237.     BuildLogo();
  1238. }
  1239.  
  1240. static void Init(void)
  1241. {
  1242.     static float ambient[] = {0.1, 0.1, 0.1, 1.0};
  1243.     static float diffuse[] = {0.5, 1.0, 1.0, 1.0};
  1244.     static float position[] = {90.0, 90.0, 150.0, 0.0};
  1245.     static float front_mat_shininess[] = {30.0};
  1246.     static float front_mat_specular[] = {0.2, 0.2, 0.2, 1.0};
  1247.     static float front_mat_diffuse[] = {0.5, 0.28, 0.38, 1.0};
  1248.     static float back_mat_shininess[] = {50.0};
  1249.     static float back_mat_specular[] = {0.5, 0.5, 0.2, 1.0};
  1250.     static float back_mat_diffuse[] = {1.0, 1.0, 0.2, 1.0};
  1251.     static float lmodel_ambient[] = {1.0, 1.0, 1.0, 1.0};
  1252.     static float lmodel_twoside[] = {GL_TRUE};
  1253.  
  1254.     glClearColor(0.0, 0.0, 0.0, 0.0);
  1255.  
  1256.     glFrontFace(GL_CW);
  1257.  
  1258.     glEnable(GL_DEPTH_TEST);
  1259.  
  1260.     glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
  1261.     glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
  1262.     glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
  1263.     glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
  1264.     glLightfv(GL_LIGHT0, GL_POSITION, position);
  1265.     glEnable(GL_LIGHTING);
  1266.     glEnable(GL_LIGHT0);
  1267.     
  1268.     glMaterialfv(GL_FRONT, GL_SHININESS, front_mat_shininess);
  1269.     glMaterialfv(GL_FRONT, GL_SPECULAR, front_mat_specular);
  1270.     glMaterialfv(GL_FRONT, GL_DIFFUSE, front_mat_diffuse);
  1271.     glMaterialfv(GL_BACK, GL_SHININESS, back_mat_shininess);
  1272.     glMaterialfv(GL_BACK, GL_SPECULAR, back_mat_specular);
  1273.     glMaterialfv(GL_BACK, GL_DIFFUSE, back_mat_diffuse);
  1274.  
  1275.     glEnable(GL_CLIP_PLANE0);
  1276.  
  1277.     if (rgb) {
  1278.     glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, decal);
  1279.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeat);
  1280.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeat);
  1281.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, nearest);
  1282.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, nearest);
  1283.     glTexImage2D(GL_TEXTURE_2D, 0, 3, CHECKIMAGEWIDTH, CHECKIMAGEHEIGHT, 0,
  1284.              GL_RGB, GL_UNSIGNED_BYTE, (GLvoid *)checkImage);
  1285.     glDisable(GL_TEXTURE_2D);
  1286.  
  1287.     glCullFace(GL_BACK);
  1288.     glEnable(GL_CULL_FACE);
  1289.     } else {
  1290.     tkSetGreyRamp();
  1291.     if (doubleBuffer) {
  1292.         colorIndexes[1] = 10;
  1293.         colorIndexes[2] = 15;
  1294.     }
  1295.     glMaterialiv(GL_FRONT_AND_BACK, GL_COLOR_INDEXES, colorIndexes);
  1296.     }
  1297.  
  1298.     BuildLists();
  1299.  
  1300.     dithering = GL_TRUE;
  1301.     shade = GL_TRUE;
  1302.     doStipple = GL_FALSE;
  1303.     polyMode = GL_BACK;
  1304. }
  1305.  
  1306. static void Reshape(int width, int height)
  1307. {
  1308.  
  1309.     glViewport(0, 0, (GLint)width, (GLint)height);
  1310.  
  1311.     glMatrixMode(GL_PROJECTION);
  1312.     glLoadIdentity();
  1313.     gluPerspective(90, 1.0, 1.0, 200.0);
  1314.     glMatrixMode(GL_MODELVIEW);
  1315. }
  1316.  
  1317. static GLenum Key(int key, GLenum mask)
  1318. {
  1319.  
  1320.     switch (key) {
  1321.       case TK_ESCAPE:
  1322.     tkQuit();
  1323.  
  1324.       case TK_LEFT:
  1325.     yRotation += 4.0;
  1326.     break;
  1327.       case TK_RIGHT:
  1328.     yRotation -= 4.0;
  1329.     break;
  1330.       case TK_UP:
  1331.     plane[3] += 4.0;
  1332.     break;
  1333.       case TK_DOWN:
  1334.     plane[3] -= 4.0;
  1335.     break;
  1336.       case TK_Z:
  1337.     zTranslation -= 1.0;
  1338.     break;
  1339.       case TK_z:
  1340.     zTranslation += 1.0;
  1341.     break;
  1342.  
  1343.       case TK_1:
  1344.     glPolygonMode(polyMode, GL_POINT);
  1345.     break;
  1346.       case TK_2:
  1347.     glPolygonMode(polyMode, GL_LINE);
  1348.     break;
  1349.       case TK_3:
  1350.     glPolygonMode(polyMode, GL_FILL);
  1351.     break;
  1352.       case TK_p:
  1353.     switch (polyMode) {
  1354.       case GL_BACK:
  1355.         polyMode = GL_FRONT;
  1356.         break;
  1357.       case GL_FRONT:
  1358.         polyMode = GL_FRONT_AND_BACK;
  1359.         break;
  1360.       case GL_FRONT_AND_BACK:
  1361.         polyMode = GL_BACK;
  1362.         break;
  1363.     }
  1364.     break;
  1365.  
  1366.       case TK_4:
  1367.     glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
  1368.     break;
  1369.       case TK_5:
  1370.     glEnable(GL_POLYGON_SMOOTH);
  1371.     if (rgb) {
  1372.         glBlendFunc(GL_SRC_ALPHA, GL_ONE);
  1373.         glEnable(GL_BLEND);
  1374.         glDisable(GL_DEPTH_TEST);
  1375.     } else {
  1376.         SetUpAntiAliasedGrayScale();
  1377.     }
  1378.     break;
  1379.       case TK_6:
  1380.     glDisable(GL_POLYGON_SMOOTH);
  1381.     if (rgb) {
  1382.         glBlendFunc(GL_ONE, GL_ZERO);
  1383.         glDisable(GL_BLEND);
  1384.         glEnable(GL_DEPTH_TEST);
  1385.     } else {
  1386.         tkSetGreyRamp();
  1387.     }
  1388.     break;
  1389.  
  1390.       case TK_8:
  1391.     dithering = !dithering;
  1392.     (dithering) ? glEnable(GL_DITHER) : glDisable(GL_DITHER);
  1393.     break;
  1394.  
  1395.       case TK_9:
  1396.     doStipple = !doStipple;
  1397.     if (doStipple) {
  1398.         glPolygonStipple(stipple);
  1399.         glEnable(GL_POLYGON_STIPPLE);
  1400.     } else {
  1401.         glDisable(GL_POLYGON_STIPPLE);
  1402.     }
  1403.     break;
  1404.  
  1405.       case TK_0:
  1406.     shade = !shade;
  1407.     (shade) ? glShadeModel(GL_SMOOTH) : glShadeModel(GL_FLAT);
  1408.     break;
  1409.  
  1410.       case TK_q:
  1411.     glDisable(GL_CULL_FACE);
  1412.     break;
  1413.       case TK_w:
  1414.     glEnable(GL_CULL_FACE);
  1415.     glCullFace(GL_FRONT);
  1416.     break;
  1417.       case TK_e:
  1418.     glEnable(GL_CULL_FACE);
  1419.     glCullFace(GL_BACK);
  1420.     break;
  1421.  
  1422.       case TK_r:
  1423.     glFrontFace(GL_CW);
  1424.     break;
  1425.       case TK_t: 
  1426.     glFrontFace(GL_CCW);
  1427.     break;
  1428.       case TK_y:
  1429.     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  1430.     glPixelStorei(GL_UNPACK_LSB_FIRST, 0);
  1431.     glPolygonStipple(stipple);
  1432.     break;
  1433.       case TK_u:
  1434.     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  1435.     glPixelStorei(GL_UNPACK_LSB_FIRST, 1);
  1436.     glPolygonStipple(stipple);
  1437.     break;
  1438.  
  1439.       case TK_a:
  1440.     glEnable(GL_TEXTURE_2D);
  1441.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeat);
  1442.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeat);
  1443.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, nearest);
  1444.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, nearest);
  1445.     glTexImage2D(GL_TEXTURE_2D, 0, 4, BRICKIMAGEWIDTH,
  1446.              BRICKIMAGEHEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE,
  1447.              (GLvoid *)brickImage);
  1448.     break;
  1449.       case TK_s:
  1450.     glEnable(GL_TEXTURE_2D);
  1451.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeat);
  1452.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeat);
  1453.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, nearest);
  1454.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, nearest);
  1455.     glTexImage2D(GL_TEXTURE_2D, 0, 3, CHECKIMAGEWIDTH,
  1456.              CHECKIMAGEHEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE,
  1457.              (GLvoid *)checkImage);
  1458.     break;
  1459.       case TK_d:
  1460.     glDisable(GL_TEXTURE_2D);
  1461.     break;
  1462.  
  1463.       case TK_f:
  1464.     glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, decal);
  1465.     break;
  1466.       case TK_g:
  1467.     glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, modulate);
  1468.     break;
  1469.  
  1470.       default:
  1471.     return GL_FALSE;
  1472.     }
  1473.     return GL_TRUE;
  1474. }
  1475.  
  1476. static void Draw(void)
  1477. {
  1478.  
  1479.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  1480.  
  1481.     glPushMatrix();
  1482.  
  1483.     glTranslatef(0, 0, zTranslation);
  1484.     glRotatef(30.0, 1, 0, 0);
  1485.     glRotatef(yRotation, 0, 1, 0);
  1486.     glClipPlane(GL_CLIP_PLANE0, plane);
  1487.     glCallList(logo);
  1488.  
  1489.     glPopMatrix();
  1490.  
  1491.     tkSwapBuffers();
  1492. }
  1493.  
  1494. static GLenum Args(int argc, char **argv)
  1495. {
  1496.     GLint i;
  1497.  
  1498.     rgb = GL_TRUE;
  1499.     doubleBuffer = GL_TRUE;
  1500.     directRender = GL_TRUE;
  1501.  
  1502.     for (i = 1; i < argc; i++) {
  1503.     if (strcmp(argv[i], "-ci") == 0) {
  1504.         rgb = GL_FALSE;
  1505.     } else if (strcmp(argv[i], "-rgb") == 0) {
  1506.         rgb = GL_TRUE;
  1507.     } else if (strcmp(argv[i], "-sb") == 0) {
  1508.         doubleBuffer = GL_FALSE;
  1509.     } else if (strcmp(argv[i], "-db") == 0) {
  1510.         doubleBuffer = GL_TRUE;
  1511.     } else if (strcmp(argv[i], "-dr") == 0) {
  1512.         directRender = GL_TRUE;
  1513.     } else if (strcmp(argv[i], "-ir") == 0) {
  1514.         directRender = GL_FALSE;
  1515.     } else {
  1516.         printf("%s (Bad option).\n", argv[i]);
  1517.         return GL_FALSE;
  1518.     }
  1519.     }
  1520.     return GL_TRUE;
  1521. }
  1522.  
  1523. void main(int argc, char **argv)
  1524. {
  1525.     GLenum type;
  1526.  
  1527.     #if defined(__MWERKS__) || defined(__SC__)
  1528.         argc = ccommand(&argv);
  1529.     #endif
  1530.     
  1531.     if (Args(argc, argv) == GL_FALSE) {
  1532.     tkQuit();
  1533.     }
  1534.  
  1535.     tkInitPosition(30, 60, 300, 300);
  1536.  
  1537.     type = TK_DEPTH;
  1538.     type |= (rgb) ? TK_RGB : TK_INDEX;
  1539.     type |= (doubleBuffer) ? TK_DOUBLE : TK_SINGLE;
  1540.     type |= (directRender) ? TK_DIRECT : TK_INDIRECT;
  1541.     tkInitDisplayMode(type);
  1542.  
  1543.     if (tkInitWindow("Logo Test") == GL_FALSE) {
  1544.     tkQuit();
  1545.     }
  1546.  
  1547.     Init();
  1548.  
  1549.     tkExposeFunc(Reshape);
  1550.     tkReshapeFunc(Reshape);
  1551.     tkKeyDownFunc(Key);
  1552.     tkDisplayFunc(Draw);
  1553.     tkExec();
  1554. }
  1555.